import { defineConfig, loadEnv } from 'vite'
import { resolve } from 'path' // 主要用于alias文件路径别名
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers'

import viteCompression from 'vite-plugin-compression'
import { createHtmlPlugin } from 'vite-plugin-html'
import { svgBuilder } from './src/plugins/svgBuilder'
import DefineOptions from "unplugin-vue-define-options/vite"
function createProxy(list = []) {
  const ret = {}
  const listArr = list.length === 0 ? '' : JSON.parse(list)
  // const listArr = JSON.parse(list)
  const httpsRE = /^https:\/\//;
  for (const [prefix, target] of listArr) {
    // console.log(prefix)
    const isHttps = httpsRE.test(target)
    // https://github.com/http-party/node-http-proxy#options
    ret[prefix] = {
      target: target,
      changeOrigin: true,
      ws: true,
      rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''),
      // https is require secure=false
      ...(isHttps ? { secure: false } : {}),
    }
  }
  return ret;
}

function pathResolve(dir) {
  return resolve(__dirname, dir);
}
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, __dirname)
  return {
    plugins: [
      vue(),
      createHtmlPlugin({
        minify: true,
        /**
         * 在这里写entry后，你将不需要在`index.html`内添加 script 标签，原有标签需要删除
         * @default src/main.ts
         */
        // entry: 'src/main.ts',
        /**
         * 如果你想将 `index.html`存放在指定文件夹，可以修改它，否则不需要配置
         * @default index.html
         */
        // template: 'public/index.html',

        /**
         * 需要注入 index.html ejs 模版的数据
         */
        inject: {
          data: {
            title: env.VITE_APP_TITLE
          },
        },
      }),
      DefineOptions(),
      svgBuilder('./src/icons/svg/'),
      AutoImport({
        resolvers: [AntDesignVueResolver({
          importStyle: false,
        })],
      }),
      Components({
        resolvers: [AntDesignVueResolver({
          importStyle: false,
        })],
        // dts: true,
        // include: [/\.vue$/, /\.vue\?vue/, /\.md$/]
      }),
      viteCompression({
        // 生成压缩包gz
        verbose: true,
        disable: false,
        threshold: 10240,
        algorithm: 'gzip',
        ext: '.gz',
      }),
    ],
    resolve: {
      alias: {
        "@": pathResolve("src"),
        // 'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js',
      }
    },
    css: {
      preprocessorOptions: {
        // scss: {
        //   additionalData: `@use "@/styles/init.scss" as *;`,
        // },
      },
    },
    publicDir: 'public', // 静态资源服务的文件夹
    base: './',
    build: {
      target: 'modules',
      outDir: 'dist', // 指定输出路径
      assetsDir: 'assets', // 指定生成静态资源的存放路径
      rollupOptions: {
        output: {
          chunkFileNames: 'static/js/[name]-[hash].js',
          entryFileNames: 'static/js/[name]-[hash].js',
          assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
        },
      },
      minify: 'terser', // 混淆器，terser构建后文件体积更小
      assetsInlineLimit: 4096, // 小于此阈值的导入或引用资源将内联为 base64 编码，以避免额外的 http 请求。设置为 0 可以完全禁用此项
      cssCodeSplit: true, // 启用/禁用 CSS 代码拆分
      sourcemap: false, // 构建后是否生成 source map 文件
      terserOptions: {
        compress: {
          drop_console: true,
          drop_debugger: true,
          pure_funcs: ['console.log'],
        },
      },
    },
    server: {
      // cors: true, // 默认启用并允许任何源
      // open: true, // 在服务器启动时自动在浏览器中打开应用程序
      proxy: createProxy(env.VITE_PROXY), // 反向代理配置，注意rewrite写法
    },
  }
})

